<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    let fengxian = {
        name: "Hydra",
        age: 34,
        sex: "男",
        // 装载遍历函数：要求返回一个对象，对象有next函数
        // next函数语法：如果return的对象的done属性使true，那么表示结束循环。
        [Symbol.iterator]: function () {
            // 获取所有的属性名数组
            let keys = Object.keys(this);
            let index = 0;

            // let that = this;

            return {
                // 这里使用箭头函数
                next: () => {
                    if (index >= keys.length) {
                        // done: true，表示结束遍历
                        return {
                            done: true,
                            value: undefined,
                        }
                    } else {
                        // done: false，表示不结束循环
                        return {
                            done: false,
                            value: this[keys[index++]]
                        }
                    }
                }
            }
        }
    }

    let yhz = {
        name: "HaozheYuan",
        age: 20,
        sex: "男",
        // [Symbol.iterator]: function*() {
        //     yield "HaozheYuan";
        //     yield 20;
        //     yield "男";
        //     return;
        // }
    }

    for (var v of fengxian) {
        console.log(v);
    }

    // 遍历函数可以使用语法糖装载
    yhz[Symbol.iterator] = function*() {
        let keys = Object.keys(this);
        for (let v of keys) {
            yield this[v];
        }
        return;
    }

    for (var v of yhz) {
        console.log(v);
    }

    // 如果想用高阶函数（数组的遍历函数）
    let arr = Array.from(yhz);
    arr.forEach(v => console.log(v));

    console.log("-------------分隔符-----------------")
    Array.prototype.forEach.call(yhz,v => console.log(v));


</script>

</html>